Coverage Report

Created: 2024-12-19 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
D:\a\tools.proto\tools.proto\compiler\src\gen\codec.rs
Line
Count
Source
1
// Copyright (c) 2024, BlockProject 3D
2
//
3
// All rights reserved.
4
//
5
// Redistribution and use in source and binary forms, with or without modification,
6
// are permitted provided that the following conditions are met:
7
//
8
//     * Redistributions of source code must retain the above copyright notice,
9
//       this list of conditions and the following disclaimer.
10
//     * Redistributions in binary form must reproduce the above copyright notice,
11
//       this list of conditions and the following disclaimer in the documentation
12
//       and/or other materials provided with the distribution.
13
//     * Neither the name of BlockProject 3D nor the names of its contributors
14
//       may be used to endorse or promote products derived from this software
15
//       without specific prior written permission.
16
//
17
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29
use crate::gen::template::Template;
30
use std::collections::HashMap;
31
32
//TODO: Allow using a single file per codec instead of 3 files.
33
34
pub struct Codec<'fragment, 'variable> {
35
    pub decl: Template<'fragment, 'variable>,
36
    pub from_bytes: Template<'fragment, 'variable>,
37
    pub write: Template<'fragment, 'variable>,
38
}
39
40
impl Codec<'_, '_> {
41
0
    pub fn from_static_bytes(decl: &'static [u8], from_bytes: &'static [u8], write: &'static [u8]) -> Self {
42
0
        Self {
43
0
            decl: Template::compile(decl).unwrap(),
44
0
            from_bytes: Template::compile(from_bytes).unwrap(),
45
0
            write: Template::compile(write).unwrap(),
46
0
        }
47
0
    }
48
}
49
50
macro_rules! count {
51
    () => (0usize);
52
    ( $x:tt $($xs:tt)* ) => (1usize + count!($($xs)*));
53
}
54
55
pub(crate) use count;
56
57
#[macro_export]
58
macro_rules! codec_map_initializer {
59
    ($($name: literal => $template: expr),*) => {
60
        {
61
            use $crate::gen::codec::count;
62
            let mut map = std::collections::HashMap::with_capacity($crate::gen::codec::count!($($name)*));
63
            $(map.insert($name, $crate::gen::template::Template::compile($template).unwrap());)*
64
            map
65
        }
66
    };
67
}
68
69
pub struct CodecMap<'fragment, 'variable> {
70
    map: HashMap<&'fragment str, Template<'fragment, 'variable>>,
71
}
72
73
impl Default for CodecMap<'_, '_> {
74
372
    fn default() -> Self {
75
372
        Self::new(HashMap::new())
76
372
    }
77
}
78
79
impl<'fragment, 'variable> CodecMap<'fragment, 'variable> {
80
374
    pub fn new(map: HashMap<&'fragment str, Template<'fragment, 'variable>>) -> Self {
81
374
        Self { map }
82
374
    }
83
84
60
    pub fn has(&self, name: &str) -> bool {
85
60
        self.map.contains_key(name)
86
60
    }
87
88
6
    pub fn insert(&mut self, name: &'fragment str, codec: Template<'fragment, 'variable>) {
89
6
        self.map.insert(name, codec);
90
6
    }
91
92
233
    pub fn get(&self, name: &str) -> Option<&Template<'fragment, 'variable>> {
93
233
        self.map.get(name)
94
233
    }
95
}